﻿using System;
using System.Collections.Generic;
using System.Web.UI.WebControls;
using MIAP.Entidades;
using MIAP.Negocio;
using MIAPWEB.Common;

namespace MIAPWEB.Forms
{
    /// <summary>
    /// Clase de la vista SolicitudRecarga.
    /// </summary>
    public partial class SolicitaRecarga : PageBase
    {
        #region Campos

        /// <summary>
        /// Clase de negocio de las operaciones de SolicitudRecarga.
        /// </summary>
        private SolicitudRecargaNegocio solicitudRecargaNegocio;

        /// <summary>
        /// Clase de negocio de las operaciones de Comunes.
        /// </summary>
        private ComunesNegocio comunesNegocio;

        #endregion

        #region Propiedades

        /// <summary>
        ///  Obtiene o establece el Id del usuario.
        /// </summary>
        private int IdUsuario
        {
            get
            {
                return Convert.ToInt32(this.ViewState[AppQueryStrings.IdUsuario]);
            }

            set
            {
                this.ViewState[AppQueryStrings.IdUsuario] = value;
            }
        }

        /// <summary>
        ///  Obtiene o establece el Id del proyecto.
        /// </summary>
        private int IdProyecto
        {
            get
            {
                return Convert.ToInt32(this.ViewState[AppQueryStrings.IdProyecto]);
            }

            set
            {
                this.ViewState[AppQueryStrings.IdProyecto] = value;
            }
        }

        /// <summary>
        ///  Obtiene o establece la solicitud de recarga.
        /// </summary>
        public SolicitudRecargaArchivoInfo SolicitudRecarga
        {
            get
            {
                return this.ViewState["SolicitudRecarga"] as SolicitudRecargaArchivoInfo;
            }

            set
            {
                this.ViewState["SolicitudRecarga"] = value;
            }
        }

        /// <summary>
        /// Obtiene o establece los resgistro resultantes de la búsqueda. 
        /// </summary>
        private IList<SolicitudRecargaArchivoInfo> DataSourceSolicitud
        {
            get
            {
                if (this.ViewState["DataSourceSolicitud"] == null)
                {
                    this.ViewState["DataSourceSolicitud"] = new List<SolicitudRecargaArchivoInfo>();
                }

                return this.ViewState["DataSourceSolicitud"] as List<SolicitudRecargaArchivoInfo>;
            }

            set
            {
                this.ViewState["DataSourceSolicitud"] = value;
            }
        }

        #endregion

        #region Constructor

        /// <summary>
        /// Inicializa una instancia de <see cref="SolicitaRecarga"/>
        /// </summary>
        public SolicitaRecarga()
        {
            this.solicitudRecargaNegocio = new SolicitudRecargaNegocio();
            this.comunesNegocio = new ComunesNegocio();
        }

        #endregion

        #region Eventos

        /// <summary>
        /// Evento que se ejecuta al cargar la página.
        /// </summary>
        /// <param name="sender">Objeto que invoca el evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void Page_Load(object sender, EventArgs e)
        {
            this.grdSolicitudes.PageSize = Convert.ToInt32(new ConfiguracionNegocio().GetNumeroPaginasGrid().Descripcion);
            if (!this.IsPostBack)
            {
                this.SolicitudRecarga = new SolicitudRecargaArchivoInfo();

                // Obtener el id del usuario logueado.
                this.IdUsuario = AppSessionManager.Instance.IdUsuario;

                this.GetProyectos();
                this.GetArchivosVersionables();
                this.GetMeses();
                this.GetAños();

                this.Search();
            }
        }

        /// <summary>
        /// Método ejecutado al dar click al botón buscar. Obtiene los archivos a los que se les puede realizar una solicitud de recarga.
        /// </summary>
        /// <param name="sender">Objeto que invoca el evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void btnBuscar_Click(object sender, EventArgs e)
        {
            this.Search();
        }

        /// <summary>
        /// Método ejecutado al dar click al botón Enviar Solicitud de Recarga. Guarda la solicitud de recarga del archivo.
        /// </summary>
        /// <param name="sender">Objeto que invoca el evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void EnviarSolicitud_Click(object sender, EventArgs e)
        {
            if (this.SolicitudRecarga.IdArchivo == null)
            {
                this.ShowMessage(this.GetGlobalResourceObject("Strings", "ErrorSeleccionarElemento").ToString());
            }
            else
            {
                this.solicitudRecargaNegocio.AddSolicitudRecarga(this.SolicitudRecarga, AppSessionManager.Instance.Usuario);

                this.ShowMessage(this.GetGlobalResourceObject("Strings", "SolicitaRecarga_SolicitudGuardada").ToString());

                // Obtiene la lista de direcciones de correo de los autorizadores del archivo.
                var listDireccionesCorreo = this.solicitudRecargaNegocio.GetCorreosAutorizadoresByArchivo(SolicitudRecarga.IdArchivo.Value);
              
                EnvioCorreo.Instance.EnviaCorreoSolicitud(listDireccionesCorreo,SolicitudRecarga.NombreArchivo);

                this.Search();
            }
        }

        /// <summary>
        /// Método ejecutado al dar click al botón salir. Redirecciona a la página principal.
        /// </summary>
        /// <param name="sender">Objeto que invoca elevento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void btnSalir_Click(object sender, EventArgs e)
        {
            Response.Redirect(Common.AppUrls.Default);
        }

        /// <summary>
        /// Metodo ejeutado al modificar la selección del dropdownlist Proyectos. Obtiene los archivos relacionados al proyecto y al usuario logueado.
        /// </summary>
        /// <param name="sender">Objeto que invoca el evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void ddlProyecto_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.IdProyecto = int.Parse(ddlProyecto.SelectedValue);

            this.GetArchivosVersionables();
        }

        /// <summary>
        /// Método ejecutado al seleccionar un elemento del grid. Obtiene el elemento seleccionado.
        /// </summary>
        /// <param name="sender">Objeto que invoca el evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void grdSolicitudes_SelectedIndexChanged(object sender, EventArgs e)
        {
            GridViewRow row = ((GridView)sender).SelectedRow;

            var dataKeys = this.grdSolicitudes.DataKeys[((GridView)sender).SelectedIndex];

            this.SolicitudRecarga.IdUsuario = AppSessionManager.Instance.IdUsuario;
            this.SolicitudRecarga.IdArchivo = int.Parse(dataKeys[0].ToString());
            this.SolicitudRecarga.NombreArchivo = row.Cells[3].Text;
            this.SolicitudRecarga.Año = int.Parse(row.Cells[5].Text);
            this.SolicitudRecarga.Mes = int.Parse(dataKeys[1].ToString());
            this.SolicitudRecarga.Version = Server.HtmlDecode(row.Cells[9].Text).Trim();
            this.SolicitudRecarga.IndicadorVersionValida = bool.Parse(dataKeys[2].ToString());
        }

        /// <summary>
        /// Evento que se ejecuta cuando se cambia de página en el grid.
        /// </summary>
        /// <param name="sender">Objeto que invoca el evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void grdSolicitudes_OnPageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            this.grdSolicitudes.PageIndex = e.NewPageIndex;
            this.grdSolicitudes.DataSource = this.DataSourceSolicitud;
            this.grdSolicitudes.DataBind();
        }

        #endregion

        #region Métodos

        /// <summary>
        /// Obtiene los proyectos.
        /// </summary>
        private void GetProyectos()
        {
            this.ddlProyecto.DataSource = AppSessionManager.Instance.GetProyectosByPagina(AppUrls.SolicitudRecargaArchivo);
            this.ddlProyecto.DataBind();
            this.comunesNegocio.SetTodos(this.GetGlobalResourceObject("strings", "Todos").ToString(), this.ddlProyecto);
        }

        /// <summary>
        /// Obtiene todos los archivos relacionados con el usuario y el proyecto.
        /// </summary>
        private void GetArchivosVersionables()
        {
            this.ddlArchivo.DataSource =this.IdProyecto>0? this.solicitudRecargaNegocio.GetArchivosByUsuarioProyecto(this.IdProyecto, this.IdUsuario):new List<CatalogoInfo>();
            this.ddlArchivo.DataBind();
            this.comunesNegocio.SetTodos(this.GetGlobalResourceObject("strings", "Todos").ToString(), this.ddlArchivo);
        }

        /// <summary>
        /// Obtiene los meses.
        /// </summary>
        private void GetMeses()
        {
            this.ddlMes.DataSource = this.comunesNegocio.GetMeses();
            this.ddlMes.DataBind();
            this.comunesNegocio.SetTodos(this.GetGlobalResourceObject("strings", "Todos").ToString(), this.ddlMes);
        }

        /// <summary>
        /// Obtiene una lista de 10 años a partir del actual.
        /// </summary>
        private void GetAños()
        {
            this.ddlAño.DataSource = this.comunesNegocio.GetAños();
            this.ddlAño.DataBind();
            this.comunesNegocio.SetTodos(this.GetGlobalResourceObject("strings", "Todos").ToString(), this.ddlAño);
        }

        /// <summary>
        /// Obtiene los filtros y busca los archivos para la solicitud de recarga.
        /// </summary>
        private void Search()
        {
            this.grdSolicitudes.SelectedIndex = -1;
            this.GetFilters();
            this.GetArchivosRecargaByFilters();
        }

        /// <summary>
        /// Obtiene los filtros.
        /// </summary>
        private void GetFilters()
        {
            this.SolicitudRecarga.IdProyecto = ddlProyecto.SelectedValue == this.comunesNegocio.ValorTodos ? this.SolicitudRecarga.IdProyecto = null : int.Parse(ddlProyecto.SelectedValue);
            this.SolicitudRecarga.IdUsuario = this.IdUsuario;
            this.SolicitudRecarga.IdArchivo = ddlArchivo.SelectedValue == this.comunesNegocio.ValorTodos ? this.SolicitudRecarga.IdArchivo = null : int.Parse(ddlArchivo.SelectedValue);
            this.SolicitudRecarga.Año = ddlAño.SelectedValue == this.comunesNegocio.ValorTodos ? this.SolicitudRecarga.Año = null : int.Parse(ddlAño.SelectedValue);
            this.SolicitudRecarga.Mes = ddlMes.SelectedValue == this.comunesNegocio.ValorTodos ? this.SolicitudRecarga.Mes = null : int.Parse(ddlMes.SelectedValue);
        }

        /// <summary>
        /// Obtiene los archivos para solicitar recarga de acuerdo a los filtros.
        /// </summary>
        public void GetArchivosRecargaByFilters()
        {
            this.DataSourceSolicitud = this.solicitudRecargaNegocio.GetArchivosRecarga(this.SolicitudRecarga);
            this.grdSolicitudes.DataSource = this.DataSourceSolicitud;
            this.grdSolicitudes.DataBind();
        }

        #endregion
    }
}